#ifndef HTTP_REQUEST_H
#define HTTP_REQUEST_H

#include <string>
#include <regex>
#include <unordered_map>

namespace http {

/**
 * @brief HTTP请求解析类
 * 封装HTTP请求的所有要素（方法、路径、头部、参数等）
 * 提供请求数据的存储、查询和操作接口
 */
class HttpRequest 
{
public:
    std::string _method;                                   // 请求方法（GET/POST等）
    std::string _path;                                     // 请求路径
    std::string _version;                                  // 协议版本（默认HTTP/1.1）
    std::string _body;                                     // 请求体
    std::smatch _matches;                                  // 路径匹配的正则表达式结果
    std::unordered_map<std::string, std::string> _headers; // 请求头字段
    std::unordered_map<std::string, std::string> _params;  // URL查询参数

public:
    /**
     * @brief 构造函数，初始化协议版本
     */
    HttpRequest();

    /**
     * @brief 重置请求对象，清除所有字段，便于复用
     */
    void reSet();

    /**
     * @brief 设置请求头字段
     * @param key 字段名
     * @param val 字段值
     */
    void setHeader(const std::string &key, const std::string &val)
    { _headers[key] = val; }
    
    /**
     * @brief 判断请求头是否包含指定字段
     * @param key 字段名
     * @return 存在返回true，否则false
     */
    bool hasHeader(const std::string &key) const
    { return _headers.count(key); }

    /**
     * @brief 获取请求头字段值
     * @param key 字段名
     * @return 字段值（不存在时返回空字符串）
     */
    std::string getHeader(const std::string &key) const 
    {
        auto it = _headers.find(key);
        return it != _headers.end() ? it->second : "";
    }

    /**
     * @brief 设置URL查询参数
     * @param key 参数名
     * @param val 参数值
     */
    void setParam(const std::string &key, const std::string &val)
    { _params[key] = val; }

    /**
     * @brief 判断查询参数是否存在
     * @param key 参数名
     * @return 存在返回true，否则false
     */
    bool hasParam(const std::string &key) const
    { return _params.count(key); }

    /**
     * @brief 获取查询参数值
     * @param key 参数名
     * @return 参数值（不存在时返回空字符串）
     */
    std::string getParam(const std::string &key) const 
    {
        auto it = _params.find(key);
        return it != _params.end() ? it->second : "";
    }

    /**
     * @brief 获取请求体长度
     * @return 长度（单位：字节）
     */
    size_t contentLength() const;

    /**
     * @brief 判断连接是否需要关闭
     * @return 需要关闭返回true，否则false（长连接）
     */
    bool close() const;
};

} // namespace http

#endif // HTTP_REQUEST_H